//============================================================================
// Copyright (C) 2009-2013 Brett R. Jones 
// All Rights Reserved
//
// You may redistribute and/or modify for non commercial and commercial uses 
// provided this copyright notice remains in place and is not modified
//
// This code is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// brettjones1900@gmail.com
// http://www.p2panarchy.com
//============================================================================
#include "RcSysSktMgrLib.h"


//============================================================================
//=== constructor ===//
RcSysTxEvent::RcSysTxEvent()
	: m_poSkt(0)
	, m_poPkt(0)
	, m_eCallbackReason(eSktCallbackReasonUnknown)
	, m_bDisconnectAfterSend(false)
{
}
//=== constructor ===//
RcSysTxEvent::RcSysTxEvent( RcSktBase * poSkt, VxPktHdr * poPkt, ESktCallbackReason eCallbackReason, BOOL bDisconnectAfterSend )
	: m_poSkt(poSkt)
	, m_eCallbackReason(eCallbackReason)
	, m_bDisconnectAfterSend( bDisconnectAfterSend )
{
	 m_poPkt = (RcSysPktHdr *)poPkt->MakeCopy();
}
//============================================================================
//=== destructor ===//
RcSysTxEvent::~RcSysTxEvent()
{
	if( m_poPkt )
	{
		delete m_poPkt;
	}
}
//============================================================================
//=== constructor ===//
RcSysSktTxEventQue::RcSysSktTxEventQue()
{
}
//============================================================================
//=== destructor ===//
RcSysSktTxEventQue::~RcSysSktTxEventQue()
{
	RcSysTxEvent * poEvent;
	int iCnt = (int)m_aoTxEvents.size();
	for( int i = 0; i < iCnt; i++ )
	{
		poEvent = m_aoTxEvents[i];
		delete poEvent;
	}
	m_aoTxEvents.clear();
}

//============================================================================
//=== methods ===//
//============================================================================
//============================================================================
//! add event to que
void RcSysSktTxEventQue::AddSktTxEvent( RcSysTxEvent * poEvent )
{
	m_oTxEventMutex.Lock();
	m_aoTxEvents.push_back( poEvent );
	m_oTxEventMutex.Unlock();
	m_oTxSemaphore.Signal();
}
//============================================================================
//! remove event from que.. returns null if no events avalil
RcSysTxEvent *	RcSysSktTxEventQue::RemoveSktTxEvent(  void )
{
	RcSysTxEvent* poEvent = NULL;
	if( m_aoTxEvents.size() )
	{
		poEvent = m_aoTxEvents[0];
		m_aoTxEvents.erase( m_aoTxEvents.begin());
		return poEvent;
	}
	return NULL;
};



